package com.example.downloadcenter;

import java.io.File;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Api {

    /**
     * 新版文件上传
     * @param completableFuture 等待上传文件future
     * @param fileMetaData 文件元数据信息封装
     * @param waitTimeMill 等待毫秒
     */
    static CompletableFuture<UploadResults> doUploadFile(CompletableFuture<File> completableFuture, FileMetaData fileMetaData, Long waitTimeMill){
            CompletableFuture<UploadResults> resultsFuture = new CompletableFuture<>();
            new Thread(() -> {
                try {
                    //业务端预计的等待时间默认会被拆分成10次等待，每次占总进度的10%
                    int count = 10;
                    File file = null;
                    while (count >0){
                        try {
                            //从future中获取文件
                            file = completableFuture.get(waitTimeMill/10, TimeUnit.MILLISECONDS);
                            //上传到aliyun
                            String url = doAliYunUpload(file);
                            //封装文件上传结果
                            UploadResults uploadResults = new UploadResults();
                            uploadResults.setUrl(url);
                            uploadResults.setSuc(true);
                            //告知业务端结果
                            resultsFuture.complete(uploadResults);
                            //更新下载中心文件状态为成功
                            saveUploadComplete(uploadResults);
                            break;
                        }  catch (TimeoutException e) {
                            //rpc更新文件进度
                            saveUploadStatus(count);
                            //总尝试次数减1
                            count --;
                        }
                    }

                    resultsFuture.completeExceptionally(new RuntimeException("未在规定时间内获取到文件"));
                } catch (Exception ex) {
                    resultsFuture.completeExceptionally(ex);
                }
            }).start();
            return resultsFuture;

    }


    /**
     * 更新下载中心进度以及url，可下载的用户id
     * @param uploadResults
     */
    static void saveUploadComplete(UploadResults uploadResults){
        System.out.println(" rpc request 告知下载中心服务文件状态为已完成，并更新文件url ..");
    }

    /**
     * 更新下载中心进度
     * @param count
     */
    static void saveUploadStatus(int count){
        System.out.println(" rpc request 更新下载中心当前文件生成进度，每次增加10% ..."+count);
    }

    /**
     * 阿里云上传
     * @param file
     * @return
     */
    static String doAliYunUpload(File file){
        System.out.println(" do aliyun upload");
        return "url...";
    }


}
